﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using DataTier;
using DataTier.Repository;
using Common;
using BusinessLogic;
using DataTier.Entities;

namespace DataServices
{
    [ServiceBehavior(Namespace = WCFSettings.Namespace, IncludeExceptionDetailInFaults = true)]
    public class ProductsService : IProductsService
    {
        /// <summary>
        /// Возвращает список Продуктов
        /// </summary>
        /// <returns></returns>
        public List<ProductEntity> GetProductList(int currentUserId, int numPage = 1, int onPage = 10, SearchParameters param = null, string sortColumn = null, string sortDirection = null)
        {
            try
            {
                var products = new ProductsRepository().GetProductList(currentUserId, numPage, onPage, param, sortColumn, sortDirection);
                return products;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                //return null;
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает количество Продуктов из базы данных
        /// </summary>
        /// <returns></returns>
        public int GetProductListCount(int currentUserId, SearchParameters param = null)
        {
            try
            {
                return new ProductsRepository().GetProductListCount(currentUserId, param);
            }
            catch (Exception ex)
            {
                return 0;
            }
        }


        /// <summary>
        /// Возвращает список Товаров без тех, у которых установлен признак СКРЫТ
        /// </summary>
        /// <returns></returns>
        public List<ProductEntity> GetNotHiddenProductList(int currentUserId)
        {
            try
            {
                var products = new ProductsRepository().GetNotHiddenProductList(currentUserId);
                return products;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                //return null;
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Категорий Продуктов
        /// </summary>
        /// <returns></returns>
        public List<ProductGroup> GetProductGroupList(int currentUserId)
        {
            try
            {
                var groups = new ProductsRepository().GetProductGroupList(currentUserId);
                return groups;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                //return null;
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список групп продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Добавляет новый продукт или обновляется уже существующий
        /// </summary>
        /// <param name="product"></param>
        /// <returns></returns>
        public int SaveProduct(int currentUserId, ProductEntity product)
        {
            try
            {
                int id = new ProductsRepository().SaveProduct(currentUserId, product);
                return id;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                //return 0;
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить продукт в базу данных.");
            }
        }


        /// <summary>
        /// Удаление Продукта из базы данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        public void DeleteProduct(int currentUserId, int productId)
        {
            try
            {
                new ProductsRepository().DeleteProduct(currentUserId, productId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить продукт из базы данных.");
                //throw new FaultException<Exception>(new Exception(ex.Message, ex), "Произошла ошибка при попытке удалить запись из базы данных.");
                //throw new Exception("Произошла ошибка при попытке удалить запись из базы данных.", ex);
                //throw new FaultException<WCFExceptionDetails>(new WCFExceptionDetails("Ошибка сохранения", ex), "Произошла ошибка при попытке удалить запись из базы данных.");
            }
        }


        /// <summary>
        /// Обновляет картинку с изображением продукта
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        /// <param name="ImageBigUrl"></param>
        /// <param name="ImageSmallUrl"></param>
        public void UpdateImageProduct(int currentUserId, int productId, string ImageBigUrl, string ImageSmallUrl)
        {
            try
            {
                new ProductsRepository().UpdateImageProduct(currentUserId, productId, ImageBigUrl, ImageSmallUrl);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке обновить продукт в базе данных.");
            }
        }


        /// <summary>
        /// Скрытие продукта (установка признака СКРЫТ)
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        /// <param name="isHidden"></param>
        public void SetIsHidden(int currentUserId, int productId, bool isHidden)
        {
            try
            {
                new ProductsRepository().SetIsHidden(currentUserId, productId, isHidden);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке обновить продукт в базе данных.");
            }

        }


        /// <summary>
        /// Возвращает список единиц измерения Товаров
        /// </summary>
        /// <returns></returns>
        public List<MeasureUnit> GetMeasureUnitList(int currentUserId)
        {
            try
            {
                var units = new ProductsRepository().GetMeasureUnitList(currentUserId);
                return units;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                //return null;
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список единиц измерения продуктов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает единицу измерения Товара по ID
        /// </summary>
        /// <returns></returns>
        public MeasureUnit GetMeasureUnitById(int currentUserId, int measureUnitId)
        {
            try
            {
                var unit = new ProductsRepository().GetMeasureUnitById(currentUserId, measureUnitId);
                return unit;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                //return null;
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить данные о единице измерения продукта из базы данных.");
            }
        }


    }
}
